/**
 * 音频和语音工具类
 * 提供TTS（文字转语音）和音效播放功能
 * 支持中英文语音合成和各种学习反馈音效
 */
import * as Speech from 'expo-speech';
import { Audio } from 'expo-av';
import { Alert } from 'react-native';

/**
 * TTS语音配置选项
 * 针对中英文优化的语音参数
 */
const TTS_OPTIONS = {
  chinese: {
    language: 'zh-CN', // 中文普通话
    pitch: 1.0,        // 音调（0.5-2.0）
    rate: 0.8,         // 语速（0.1-2.0，较慢便于学习）
    voice: null        // 使用系统默认中文语音
  },
  english: {
    language: 'en-US', // 美式英语
    pitch: 1.0,        // 音调
    rate: 0.75,        // 语速（稍慢便于学习）
    voice: null        // 使用系统默认英语语音
  }
};

/**
 * 初始化音频系统
 * 设置音频模式以支持语音播放
 */
export const initializeAudio = async () => {
  try {
    // 设置音频模式为可播放模式
    await Audio.setAudioModeAsync({
      allowsRecordingIOS: false,           // iOS不允许录音
      staysActiveInBackground: false,      // 后台不保持活跃
      interruptionModeIOS: Audio.INTERRUPTION_MODE_IOS_DO_NOT_MIX, // iOS中断模式
      playsInSilentModeIOS: true,         // 静音模式下也播放
      shouldDuckAndroid: true,            // Android下降低其他音频音量
      interruptionModeAndroid: Audio.INTERRUPTION_MODE_ANDROID_DO_NOT_MIX, // Android中断模式
      playThroughEarpieceAndroid: false   // 不通过听筒播放
    });
    console.log('音频系统初始化成功');
  } catch (error) {
    console.error('音频系统初始化失败:', error);
  }
};

/**
 * 播放TTS语音
 * 支持中英文文本的语音合成
 * @param {string} text - 要朗读的文本
 * @param {string} language - 语言类型 ('chinese' | 'english' | 'auto')
 * @param {Object} customOptions - 自定义语音选项
 * @returns {Promise<boolean>} 是否播放成功
 */
export const speakText = async (text, language = 'auto', customOptions = {}) => {
  try {
    // 停止当前正在播放的语音
    await Speech.stop();
    
    // 自动检测语言类型
    if (language === 'auto') {
      // 简单的中英文检测：包含中文字符则为中文，否则为英文
      const containsChinese = /[\u4e00-\u9fa5]/.test(text);
      language = containsChinese ? 'chinese' : 'english';
    }
    
    // 获取对应语言的TTS配置
    const options = {
      ...TTS_OPTIONS[language],
      ...customOptions
    };
    
    console.log(`开始朗读${language === 'chinese' ? '中文' : '英文'}文本: "${text}"`);
    
    // 执行语音合成
    await Speech.speak(text, options);
    
    return true;
  } catch (error) {
    console.error('TTS播放失败:', error);
    
    // 用户友好的错误提示
    Alert.alert(
      '语音播放失败',
      '无法播放语音，请检查设备音量设置或稍后重试。',
      [{ text: '确定', style: 'default' }]
    );
    
    return false;
  }
};

/**
 * 停止当前TTS播放
 * 立即停止正在进行的语音合成
 */
export const stopSpeaking = async () => {
  try {
    await Speech.stop();
    console.log('语音播放已停止');
  } catch (error) {
    console.error('停止语音播放失败:', error);
  }
};

/**
 * 检查TTS是否可用
 * 检测设备是否支持语音合成
 * @returns {Promise<boolean>} TTS是否可用
 */
export const isTTSAvailable = async () => {
  try {
    // 检查Speech模块是否可用
    const available = Speech.getAvailableVoicesAsync !== undefined;
    
    if (available) {
      // 尝试获取可用语音列表以确认功能正常
      const voices = await Speech.getAvailableVoicesAsync();
      console.log(`发现 ${voices.length} 个可用语音`);
      return voices.length > 0;
    }
    
    return false;
  } catch (error) {
    console.error('检查TTS可用性失败:', error);
    return false;
  }
};

/**
 * 预制音效枚举
 * 定义各种学习场景下的音效类型
 */
export const SOUND_EFFECTS = {
  CORRECT: 'correct',           // 答对时的成功音效
  INCORRECT: 'incorrect',       // 答错时的错误音效
  LEVEL_UP: 'levelup',         // 升级时的庆祝音效
  ACHIEVEMENT: 'achievement',   // 获得成就时的音效
  BUTTON_PRESS: 'button',      // 按钮点击音效
  LESSON_COMPLETE: 'complete'   // 课程完成音效
};

/**
 * 音效缓存对象
 * 预加载常用音效以提高响应速度
 */
let soundCache = {};

/**
 * 创建音效对象
 * 为不同类型的音效生成对应的Audio.Sound实例
 * @param {string} soundType - 音效类型
 * @returns {Promise<Audio.Sound|null>} 音效对象
 */
const createSoundEffect = async (soundType) => {
  try {
    // 根据音效类型生成不同频率的提示音
    const soundConfigs = {
      [SOUND_EFFECTS.CORRECT]: {
        // 正确答案：愉悦的上升音调（C大调和弦）
        frequency: [523.25, 659.25, 783.99], // C5-E5-G5
        duration: 300,
        volume: 0.7
      },
      [SOUND_EFFECTS.INCORRECT]: {
        // 错误答案：低沉的警告音
        frequency: [220, 196], // A3-G3
        duration: 500,
        volume: 0.6
      },
      [SOUND_EFFECTS.LEVEL_UP]: {
        // 升级：激昂的上升音阶
        frequency: [523.25, 587.33, 659.25, 698.46, 783.99], // C5-D5-E5-F5-G5
        duration: 800,
        volume: 0.8
      },
      [SOUND_EFFECTS.ACHIEVEMENT]: {
        // 成就解锁：特殊的成就音效
        frequency: [659.25, 783.99, 987.77], // E5-G5-B5
        duration: 600,
        volume: 0.75
      },
      [SOUND_EFFECTS.BUTTON_PRESS]: {
        // 按钮点击：简短的确认音
        frequency: [800],
        duration: 100,
        volume: 0.4
      },
      [SOUND_EFFECTS.LESSON_COMPLETE]: {
        // 课程完成：胜利的音效
        frequency: [523.25, 659.25, 783.99, 1046.50], // C5-E5-G5-C6
        duration: 1000,
        volume: 0.8
      }
    };

    const config = soundConfigs[soundType];
    if (!config) {
      console.warn(`未知的音效类型: ${soundType}`);
      return null;
    }

    // 这里应该创建实际的音效，但为了简化演示，我们使用系统音效
    // 在实际应用中，你可以使用预录制的音效文件或通过算法生成音效
    
    console.log(`创建音效: ${soundType}，频率: ${config.frequency.join(', ')}Hz`);
    
    // 返回一个模拟的音效对象
    return {
      type: soundType,
      config,
      playAsync: async () => {
        console.log(`播放音效: ${soundType}`);
        // 这里可以集成实际的音效播放逻辑
        // 例如使用 expo-av 播放预录制的音效文件
      }
    };
    
  } catch (error) {
    console.error(`创建音效失败 (${soundType}):`, error);
    return null;
  }
};

/**
 * 播放音效
 * 播放指定类型的音效，如答对、答错、升级等
 * @param {string} soundType - 音效类型（来自SOUND_EFFECTS枚举）
 * @param {number} volume - 音量（0.0-1.0）
 * @returns {Promise<boolean>} 是否播放成功
 */
export const playSoundEffect = async (soundType, volume = 1.0) => {
  try {
    // 检查音效类型是否有效
    if (!Object.values(SOUND_EFFECTS).includes(soundType)) {
      console.warn(`无效的音效类型: ${soundType}`);
      return false;
    }

    // 从缓存中获取或创建音效
    if (!soundCache[soundType]) {
      soundCache[soundType] = await createSoundEffect(soundType);
    }

    const sound = soundCache[soundType];
    if (!sound) {
      console.error(`音效创建失败: ${soundType}`);
      return false;
    }

    // 播放音效
    await sound.playAsync();
    
    console.log(`音效播放成功: ${soundType}`);
    return true;
    
  } catch (error) {
    console.error(`音效播放失败 (${soundType}):`, error);
    return false;
  }
};

/**
 * 预加载常用音效
 * 在应用启动时预加载常用音效以提高响应速度
 */
export const preloadSounds = async () => {
  try {
    console.log('开始预加载音效...');
    
    // 预加载最常用的音效
    const commonSounds = [
      SOUND_EFFECTS.CORRECT,
      SOUND_EFFECTS.INCORRECT,
      SOUND_EFFECTS.BUTTON_PRESS
    ];

    const loadPromises = commonSounds.map(async (soundType) => {
      try {
        soundCache[soundType] = await createSoundEffect(soundType);
        console.log(`预加载音效成功: ${soundType}`);
      } catch (error) {
        console.error(`预加载音效失败 (${soundType}):`, error);
      }
    });

    await Promise.all(loadPromises);
    console.log('音效预加载完成');
    
  } catch (error) {
    console.error('音效预加载失败:', error);
  }
};

/**
 * 清理音效缓存
 * 释放音效资源，通常在应用退出时调用
 */
export const cleanupSounds = async () => {
  try {
    console.log('开始清理音效缓存...');
    
    // 停止所有正在播放的音效
    const cleanupPromises = Object.values(soundCache).map(async (sound) => {
      if (sound && sound.unloadAsync) {
        try {
          await sound.unloadAsync();
        } catch (error) {
          console.error('音效清理失败:', error);
        }
      }
    });

    await Promise.all(cleanupPromises);
    
    // 清空缓存
    soundCache = {};
    
    console.log('音效缓存清理完成');
    
  } catch (error) {
    console.error('音效缓存清理失败:', error);
  }
};

/**
 * 获取可用的TTS语音列表
 * 用于用户选择偏好的语音
 * @returns {Promise<Array>} 可用语音列表
 */
export const getAvailableVoices = async () => {
  try {
    const voices = await Speech.getAvailableVoicesAsync();
    
    // 过滤出中英文语音
    const filteredVoices = voices.filter(voice => 
      voice.language.startsWith('zh') || voice.language.startsWith('en')
    );
    
    console.log(`找到 ${filteredVoices.length} 个中英文语音`);
    return filteredVoices;
    
  } catch (error) {
    console.error('获取语音列表失败:', error);
    return [];
  }
};

/**
 * 设置TTS语音偏好
 * 允许用户自定义语音设置
 * @param {string} language - 语言类型
 * @param {Object} options - 语音选项
 */
export const setTTSPreferences = (language, options) => {
  try {
    if (TTS_OPTIONS[language]) {
      TTS_OPTIONS[language] = {
        ...TTS_OPTIONS[language],
        ...options
      };
      console.log(`更新 ${language} 语音设置:`, options);
    } else {
      console.warn(`不支持的语言类型: ${language}`);
    }
  } catch (error) {
    console.error('设置语音偏好失败:', error);
  }
};